;(function($) {
	'use strict';

    /** xscrollload */
	$.fn.xscrollload = function(options) {
		return new XScrollLoad(this, options);
	};
	
	var XScrollLoad = function(obj, options) {
		var self = this;
		
		self.$obj = obj;
		self.$options = options;
		self.$elem = null;
		
		self.$haveData = true;
		self.$deltaY = 0;
		self.$lastPointY = 0;
		self.$newY = 0;
		self.$y = 0;
		
		self.$upInsertDOM = false;		// 上方是否插入DOM
        self.$loading = false;			// loading状态
        self.$isLockUp = false;			// 是否锁定
        self.$isLockDown = false;
        self.$isData = true;			// 是否有数据
        self.$_scrollTop = 0;
		
		self._init();
	};

	XScrollLoad.prototype = {
        /** 初始化 */
        _init: function() {
            var self = this;
            
            self._preProcess();
            self._createDomElem();
			self._bindEvent();
			self._show();
            
            return self;								// VERY IMPORTANT!!! 这样才能继续调用后面的其它方法
        },
        
        /* 预处理 */
        _preProcess: function() {
            var self = this;
            
            self.$options = $.extend({}, XScrollLoad.DEFAULTS, self.$options);		// 将调用者的参数与本对象的默认参数进行合并
        },
        
        /* 构建HTML */
        _createDomElem: function() {
            var self = this;

            // 如果有数据且屏幕没显示满
            while (self.$haveData && self.$obj.height() < self.$options.clientArea.height()) {
    			console.log("1111111111111111111111 self.$haveData = " + self.$haveData);
    			console.log("1111111111111111111111 height obj = " + self.$obj.height());
    			console.log("1111111111111111111111 height clientArea = " + self.$options.clientArea.height());
            	self.$options.scrollUpHandler(self);
    			console.log("2222222222222222222222 self.$haveData = " + self.$haveData);
    			console.log("2222222222222222222222 height obj = " + self.$obj.height());
    			console.log("2222222222222222222222 height clientArea = " + self.$options.clientArea.height());
            }
            
            // 如果还有数据，则显示“上拉加载更多”
            if (self.$haveData) {
            	self.$obj.append('<div class="xscrollload-down">' + self.$options.domDown.refreshTitle + '</div>');
            }
        },

        /* 绑定事件 */
        _bindEvent: function() {
			var self = this;
			
			// 绑定触摸事件
			self.$obj.on('touchstart', function(event) {self._start(event, self);});
			self.$obj.on('touchmove', function(event) {self._move(event, self);});
		//	self.$obj.on('touchend', self._touch);

	        // 绑定滚动事件
		//	$(self.$options.clientArea).on('scroll', self._scroll);
		},

		/* _start */
	    _start: function(event, self) {
	    	var point = event.touches ? event.touches[0] : event;
	        
        	// 要先移除浏览器默认事件处理，并阻止当前事件向祖辈元素的冒泡传递
       // 	event.preventDefault();
        //	event.stopPropagation();

            console.log("_start point.pageY (" + point.pageY + ")");

         	// 保存值
			self.$lastPointY = point.pageY;
		//	self.$touchScrollTop = me.$scrollArea.scrollTop();
	    },

		/* _move */
	    _move: function(event, self) {
	    	var point = event.touches ? event.touches[0] : event;
	        
        	// 要先移除浏览器默认事件处理，并阻止当前事件向祖辈元素的冒泡传递
        //	event.preventDefault();
        //	event.stopPropagation();

            console.log("_move point.pageY (" + point.pageY + ")");

			self.$deltaY = point.pageY - self.$lastPointY;
		//	self.$lastPointY = point.pageY;

        //    self.$newY = self.$y + self.$deltaY;
       //     self.$newY += self.$deltaY;
        //    console.log("_move self.$newY  (" + self.$newY + ")");

       //     self.$obj.css({'top': self.$newY});
       //     self.$obj.css({'top': self.$deltaY});
	    },

		/* _end */
	    _end: function(event) {
	    	console.log("Touch end (" + event.changedTouches[0].pageX + ", " + event.changedTouches[0].pageY + ")");
	    },

		/* _scroll */
	    _scroll: function(event) {  
	        console.log("_scroll...");
	    },
        
        /* _foo */
        _foo: function() {
            var self = this;
			
            // 对象高度与可视区域高度
			console.log("height obj = " + self.$obj.height());
			console.log("height clientArea = " + self.$options.clientArea.height());
            
		//	console.log($(window).height());					// 浏览器当前窗口可视区域高度 
		//	console.log($(document).height());					// 浏览器当前窗口文档的高度 
		//	console.log($(document.body).height());				// 浏览器当前窗口文档body的高度

			// 如果文档高度不大于窗口高度，数据较少，自动加载下方数据
	    //    if (self._scrollContentHeight <= self._scrollWindowHeight) {
	     //   	_scrollUp();
	      //  }
        },

        /* 执行方法 */
        _execFunc: function(type) {
            var self = this;
            if (self.$options[type] && typeof self.$options[type] === 'function') {
                self.$options[type](self);
            }
        },
        
        /* _show */
        _show: function() {
        },
        
        /****** 4 outter ******/
        haveData: function(flag) {
            var self = this;
            
        	self.$haveData = flag;
        },
	};

	XScrollLoad.DEFAULTS = {
        clientArea : null,								// 滑动区域
        domDown : {										// 下方DOM
            refreshTitle : '↑上拉加载更多',
            loadTitle    : '加载中...',
            noDataTitle  : '暂无数据'
        },
        domUp : {										// 上方DOM
        	refreshTitle : '↓下拉刷新',
            updateTitle  : '↑释放更新',
            loadTitle    : '加载中...',
        },
        distance : 50,									// 拉动距离
        threshold : '',									// 提前加载距离
        scrollUpHandler			: null,					// 向上滑动执行函数
        scrollDownHandler		: null,					// 向下滑动执行函数
    };
})(window.Zepto || window.jQuery);